/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence.controllers.impl;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.osiris.persistence.Asignacionesproyecto;
import org.osiris.persistence.AsignacionesproyectoPK;
import org.osiris.persistence.Proyecto;
import org.osiris.persistence.Usuario;
import org.osiris.persistence.controllers.AsignacionesInterface;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;
import org.osiris.persistence.controllers.exceptions.PreexistingEntityException;

/**
 *
 * @author amartinez
 */
public class AsignacionesproyectoJpaController implements AsignacionesInterface {

    public AsignacionesproyectoJpaController() {
        emf = CreadorPU.getEntityManagerFactory();
    }
    private EntityManagerFactory emf = null;

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#getEntityManager()
	 */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#create(org.osiris.persistence.Asignacionesproyecto)
	 */
    public void create(Asignacionesproyecto asignacionesproyecto) throws PreexistingEntityException, Exception {
        if (asignacionesproyecto.getAsignacionesproyectoPK() == null) {
            asignacionesproyecto.setAsignacionesproyectoPK(new AsignacionesproyectoPK());
        }
        asignacionesproyecto.getAsignacionesproyectoPK().setIdProyecto(asignacionesproyecto.getProyecto().getIdProyecto());
        asignacionesproyecto.getAsignacionesproyectoPK().setIdUsuario(asignacionesproyecto.getUsuario().getIdUsuario());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Proyecto proyecto = asignacionesproyecto.getProyecto();
            if (proyecto != null) {
                proyecto = em.getReference(proyecto.getClass(), proyecto.getIdProyecto());
                asignacionesproyecto.setProyecto(proyecto);
            }
            Usuario usuario = asignacionesproyecto.getUsuario();
            if (usuario != null) {
                usuario = em.getReference(usuario.getClass(), usuario.getIdUsuario());
                asignacionesproyecto.setUsuario(usuario);
            }
            em.persist(asignacionesproyecto);
            if (proyecto != null) {
                proyecto.getAsignacionesproyectoList().add(asignacionesproyecto);
                proyecto = em.merge(proyecto);
            }
            if (usuario != null) {
                usuario.getAsignacionesproyectoList().add(asignacionesproyecto);
                usuario = em.merge(usuario);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findAsignacionesproyecto(asignacionesproyecto.getAsignacionesproyectoPK()) != null) {
                throw new PreexistingEntityException("Asignacionesproyecto " + asignacionesproyecto + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#edit(org.osiris.persistence.Asignacionesproyecto)
	 */
    public void edit(Asignacionesproyecto asignacionesproyecto) throws NonexistentEntityException, Exception {
        asignacionesproyecto.getAsignacionesproyectoPK().setIdProyecto(asignacionesproyecto.getProyecto().getIdProyecto());
        asignacionesproyecto.getAsignacionesproyectoPK().setIdUsuario(asignacionesproyecto.getUsuario().getIdUsuario());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Asignacionesproyecto persistentAsignacionesproyecto = em.find(Asignacionesproyecto.class, asignacionesproyecto.getAsignacionesproyectoPK());
            Proyecto proyectoOld = persistentAsignacionesproyecto.getProyecto();
            Proyecto proyectoNew = asignacionesproyecto.getProyecto();
            Usuario usuarioOld = persistentAsignacionesproyecto.getUsuario();
            Usuario usuarioNew = asignacionesproyecto.getUsuario();
            if (proyectoNew != null) {
                proyectoNew = em.getReference(proyectoNew.getClass(), proyectoNew.getIdProyecto());
                asignacionesproyecto.setProyecto(proyectoNew);
            }
            if (usuarioNew != null) {
                usuarioNew = em.getReference(usuarioNew.getClass(), usuarioNew.getIdUsuario());
                asignacionesproyecto.setUsuario(usuarioNew);
            }
            asignacionesproyecto = em.merge(asignacionesproyecto);
            if (proyectoOld != null && !proyectoOld.equals(proyectoNew)) {
                proyectoOld.getAsignacionesproyectoList().remove(asignacionesproyecto);
                proyectoOld = em.merge(proyectoOld);
            }
            if (proyectoNew != null && !proyectoNew.equals(proyectoOld)) {
                proyectoNew.getAsignacionesproyectoList().add(asignacionesproyecto);
                proyectoNew = em.merge(proyectoNew);
            }
            if (usuarioOld != null && !usuarioOld.equals(usuarioNew)) {
                usuarioOld.getAsignacionesproyectoList().remove(asignacionesproyecto);
                usuarioOld = em.merge(usuarioOld);
            }
            if (usuarioNew != null && !usuarioNew.equals(usuarioOld)) {
                usuarioNew.getAsignacionesproyectoList().add(asignacionesproyecto);
                usuarioNew = em.merge(usuarioNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                AsignacionesproyectoPK id = asignacionesproyecto.getAsignacionesproyectoPK();
                if (findAsignacionesproyecto(id) == null) {
                    throw new NonexistentEntityException("The asignacionesproyecto with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#destroy(org.osiris.persistence.AsignacionesproyectoPK)
	 */
    public void destroy(AsignacionesproyectoPK id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Asignacionesproyecto asignacionesproyecto;
            try {
                asignacionesproyecto = em.getReference(Asignacionesproyecto.class, id);
                asignacionesproyecto.getAsignacionesproyectoPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The asignacionesproyecto with id " + id + " no longer exists.", enfe);
            }
            Proyecto proyecto = asignacionesproyecto.getProyecto();
            if (proyecto != null) {
                proyecto.getAsignacionesproyectoList().remove(asignacionesproyecto);
                proyecto = em.merge(proyecto);
            }
            Usuario usuario = asignacionesproyecto.getUsuario();
            if (usuario != null) {
                usuario.getAsignacionesproyectoList().remove(asignacionesproyecto);
                usuario = em.merge(usuario);
            }
            em.remove(asignacionesproyecto);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#findAsignacionesproyectoEntities()
	 */
    public List<Asignacionesproyecto> findAsignacionesproyectoEntities() {
        return findAsignacionesproyectoEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#findAsignacionesproyectoEntities(int, int)
	 */
    public List<Asignacionesproyecto> findAsignacionesproyectoEntities(int maxResults, int firstResult) {
        return findAsignacionesproyectoEntities(false, maxResults, firstResult);
    }

    private List<Asignacionesproyecto> findAsignacionesproyectoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Asignacionesproyecto as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#findAsignacionesproyecto(org.osiris.persistence.AsignacionesproyectoPK)
	 */
    public Asignacionesproyecto findAsignacionesproyecto(AsignacionesproyectoPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Asignacionesproyecto.class, id);
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.AsignacionesInterface#getAsignacionesproyectoCount()
	 */
    public int getAsignacionesproyectoCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Asignacionesproyecto as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
